Skip to content

Fix StringRef build failure with newer libc++#8307

Merged
bob80905 merged 1 commit intomicrosoft:mainfrom
tsukinoko-kun:fix/macos-sdk
Apr 23, 2026
Merged

Fix StringRef build failure with newer libc++#8307
bob80905 merged 1 commit intomicrosoft:mainfrom
tsukinoko-kun:fix/macos-sdk

Conversation

@tsukinoko-kun
Copy link
Copy Markdown
Contributor

Fixes #8306.

Summary

Building DXC with newer Apple toolchains fails in include/llvm/ADT/StringRef.h because libc++ now rejects user specializations of certain standard library traits. DXC currently specializes:

  • std::is_nothrow_constructible<std::string, llvm::StringRef>
  • std::is_nothrow_constructible<std::string, llvm::StringRef &>
  • std::is_nothrow_constructible<std::string, const llvm::StringRef &>
    On Xcode 26.4 / Apple clang 21 / libc++, that now produces an error like:

is_nothrow_constructible cannot be specialized: Users are not allowed to specialize this standard library entity

What this changes

This patch keeps the existing HLSL workaround for non-libc++ standard libraries, but disables those std::is_nothrow_constructible specializations when building against libc++:

#if !defined(_LIBCPP_VERSION)
...
#endif

Why this fixes the issue
The failure is caused by the specializations themselves, not by any runtime behavior in StringRef.
For libc++:

  • the specializations are now ill-formed and rejected at parse time
  • libc++ already computes std::is_nothrow_constructible<std::string, llvm::StringRef> correctly without the workaround
    So the fix is to stop declaring the forbidden specialization on libc++, while preserving the existing behavior everywhere else.
    Why I chose this approach
    I looked at the HLSL-specific block in StringRef.h and tested the current Apple libc++ behavior directly. Without the manual specialization, libc++ still reports the relevant is_nothrow_constructible cases as false, which matches the intent of the original workaround.
    That made this the narrowest safe fix:
  • it resolves the Xcode/libc++ build break in DirectXShaderCompiler vendored in SDL_shadercross fails to build with Xcode 26.4 / Apple clang 21 on macOS #8306
  • it does not change runtime code generation or ABI
  • it preserves the original workaround for non-libc++ environments where it may still be needed
    Validation
    I verified:
  • the original header fails to compile with current Xcode/libc++
  • after this change, the header compiles cleanly
  • on libc++, the relevant std::is_nothrow_constructible instantiations still evaluate to false

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Mar 27, 2026

✅ With the latest revision this PR passed the C/C++ code formatter.

@pow2clk
Copy link
Copy Markdown
Collaborator

pow2clk commented Mar 30, 2026

@damyannp I agree with the argument made in #8303 that the static asserts ensure that, on all currently supported compilers, the static asserts verify that this explicit manipulation isn't required anymore. I tested my own fix very similar to that approach on VS 2017 and others and found no issues. Maybe @tex3d remembers the history here.

That said, at this point, the compiler will not build on macos, so this or something similar really needs to go in. I have my own fix with a couple new mac compiler warnings fixed too here if you're interested pow2clk@ea596b1

@bogner
Copy link
Copy Markdown
Collaborator

bogner commented Mar 30, 2026

Do we need to keep the workaround for non-libc++ standard libraries? The comments in #8303 strongly suggest we can just remove this completely.

@damyanp
Copy link
Copy Markdown
Member

damyanp commented Mar 31, 2026

Do we need to keep the workaround for non-libc++ standard libraries? The comments in #8303 strongly suggest we can just remove this completely.

Maybe the test added in minchopaskal@9903286#diff-2f6bf948cfb0de9574a698d2a6fc79359d333c73fb62a9d357ace4bc2d86a4c3 would be enough to give us confidence?

@tsukinoko-kun
Copy link
Copy Markdown
Contributor Author

I suggest fixing compiler errors first, then later removing workarounds. I don't care if you use my PR or any other fix.
It's a "make it work again ASAP" without breaking anything.

@tsukinoko-kun
Copy link
Copy Markdown
Contributor Author

The required microsoft.DirectXShaderCompiler check seems to be stuck in ‘Expected — Waiting for status to be reported’. Could a maintainer please trigger/re-run the Azure pipeline?

@bob80905
Copy link
Copy Markdown
Collaborator

/azp run

@azure-pipelines
Copy link
Copy Markdown

Azure Pipelines successfully started running 1 pipeline(s).

@tsukinoko-kun
Copy link
Copy Markdown
Contributor Author

Hey, can this PR be merged? If you want me to do anything beforehand, please let me know.

Copy link
Copy Markdown
Collaborator

@bogner bogner left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't understand why we don't just delete this code completely (like in #8303, which I think was a better fix). This isn't wrong though, so I suppose it's fine.

@bob80905 bob80905 merged commit bacbfaa into microsoft:main Apr 23, 2026
12 checks passed
@github-project-automation github-project-automation Bot moved this from New to Done in HLSL Roadmap Apr 23, 2026
madebr pushed a commit to libsdl-org/DirectXShaderCompiler that referenced this pull request Apr 24, 2026
Fixes microsoft#8306.
## Summary
Building DXC with newer Apple toolchains fails in
`include/llvm/ADT/StringRef.h` because libc++ now rejects user
specializations of certain standard library traits. DXC currently
specializes:
- `std::is_nothrow_constructible<std::string, llvm::StringRef>`
- `std::is_nothrow_constructible<std::string, llvm::StringRef &>`
- `std::is_nothrow_constructible<std::string, const llvm::StringRef &>`
On Xcode 26.4 / Apple clang 21 / libc++, that now produces an error
like:
> `is_nothrow_constructible` cannot be specialized: Users are not
allowed to specialize this standard library entity
## What this changes
This patch keeps the existing HLSL workaround for non-libc++ standard
libraries, but disables those `std::is_nothrow_constructible`
specializations when building against libc++:
```cpp
#if !defined(_LIBCPP_VERSION)
...
#endif
```
Why this fixes the issue
The failure is caused by the specializations themselves, not by any
runtime behavior in StringRef.
For libc++:
- the specializations are now ill-formed and rejected at parse time
- libc++ already computes std::is_nothrow_constructible<std::string,
llvm::StringRef> correctly without the workaround
So the fix is to stop declaring the forbidden specialization on libc++,
while preserving the existing behavior everywhere else.
Why I chose this approach
I looked at the HLSL-specific block in StringRef.h and tested the
current Apple libc++ behavior directly. Without the manual
specialization, libc++ still reports the relevant
is_nothrow_constructible cases as false, which matches the intent of the
original workaround.
That made this the narrowest safe fix:
- it resolves the Xcode/libc++ build break in microsoft#8306
- it does not change runtime code generation or ABI
- it preserves the original workaround for non-libc++ environments where
it may still be needed
Validation
I verified:
- the original header fails to compile with current Xcode/libc++
- after this change, the header compiles cleanly
- on libc++, the relevant std::is_nothrow_constructible instantiations
still evaluate to false

(cherry picked from commit bacbfaa)
madebr pushed a commit to libsdl-org/DirectXShaderCompiler that referenced this pull request Apr 24, 2026
Fixes microsoft#8306.
## Summary
Building DXC with newer Apple toolchains fails in
`include/llvm/ADT/StringRef.h` because libc++ now rejects user
specializations of certain standard library traits. DXC currently
specializes:
- `std::is_nothrow_constructible<std::string, llvm::StringRef>`
- `std::is_nothrow_constructible<std::string, llvm::StringRef &>`
- `std::is_nothrow_constructible<std::string, const llvm::StringRef &>`
On Xcode 26.4 / Apple clang 21 / libc++, that now produces an error
like:
> `is_nothrow_constructible` cannot be specialized: Users are not
allowed to specialize this standard library entity
## What this changes
This patch keeps the existing HLSL workaround for non-libc++ standard
libraries, but disables those `std::is_nothrow_constructible`
specializations when building against libc++:
```cpp
#if !defined(_LIBCPP_VERSION)
...
#endif
```
Why this fixes the issue
The failure is caused by the specializations themselves, not by any
runtime behavior in StringRef.
For libc++:
- the specializations are now ill-formed and rejected at parse time
- libc++ already computes std::is_nothrow_constructible<std::string,
llvm::StringRef> correctly without the workaround
So the fix is to stop declaring the forbidden specialization on libc++,
while preserving the existing behavior everywhere else.
Why I chose this approach
I looked at the HLSL-specific block in StringRef.h and tested the
current Apple libc++ behavior directly. Without the manual
specialization, libc++ still reports the relevant
is_nothrow_constructible cases as false, which matches the intent of the
original workaround.
That made this the narrowest safe fix:
- it resolves the Xcode/libc++ build break in microsoft#8306
- it does not change runtime code generation or ABI
- it preserves the original workaround for non-libc++ environments where
it may still be needed
Validation
I verified:
- the original header fails to compile with current Xcode/libc++
- after this change, the header compiles cleanly
- on libc++, the relevant std::is_nothrow_constructible instantiations
still evaluate to false

(cherry picked from commit bacbfaa)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

DirectXShaderCompiler vendored in SDL_shadercross fails to build with Xcode 26.4 / Apple clang 21 on macOS

5 participants